package com.itheima.a06bigIntegerdemo01;

import java.math.BigInteger;
import java.util.Random;

/***
 *@title BigIntegerDemo01
 *@description <TODO description class purpose>
 *@author 12468
 *@version 1.0.0
 *@create 2024-11-28 1:39
 **/
public class BigIntegerDemo01 {
    public static void main(String[] args) {

        /**
         * BigInteger 一旦数据创建内部的数据不能改变
         */

        // 获取一个随机整数范围 [0 ~ 2的num次]
        Random r = new Random();
        BigInteger bd1 = new BigInteger(4, r);
        System.out.println(bd1);
        // 随机获取一个 0 ~ 16之内的整数
        // for (int i = 0; i < 100; i++) {
        //     BigInteger bgr = new BigInteger(4, r);
        //     System.out.println(bgr);
        // }

        // 获取一个指定的大整数
        // 细节：字符串必须是整数，否则报错
        BigInteger bd2 = new BigInteger("999999999999999999");
        System.out.println(bd2);

        // 获取指定进制的大整数
        /**
         * 细节：
         *  1、字符串中的数字必须是整数
         *  2、字符串中的数字必须要跟禁止吻合
         *      比如：二进制中只能出现0、1，写其他则会报错
         */
        BigInteger bd3 = new BigInteger("100", 2);
        System.out.println(bd3);

        /**
         * 静态方法获取 Big Integer 的对象，内部有优化
         * 细节：
         *  1、能表示范围比较小，只能在 long 的取值范围之内，如果超过 long 范围报错
         *  2、在内部对常用的数字：-16 ~ 16 进行优化
         *      提前把 -16 ~ 16 先创建好 bigInteger 对象，如果多次获取不会重新创建
         */
        BigInteger bd4 = BigInteger.valueOf(16);
        BigInteger bd5 = BigInteger.valueOf(16);

        System.out.println(bd4 == bd5); // true

        BigInteger bd6 = BigInteger.valueOf(17);
        BigInteger bd7 = BigInteger.valueOf(17);

        System.out.println(bd6 == bd7); // false

        // BigInteger 一旦数据创建内部的数据不能改变
        BigInteger bg8 = BigInteger.valueOf(1);
        BigInteger bg9 = BigInteger.valueOf(2);
        BigInteger result = bg8.add(bg9);
        System.out.println(result);
        // 此时 不会修改参与计算的 BigInteger 对象中值，而是产生一个新的 BigInteger 对象记录 3
        System.out.println((bg9.add(bg8)) == result); // 3



    }
}
